package com.docted.design.pattern.singleton.lazy;

/**
 * @author DoCted
 * @since v1.0 2018/3/7
 */
public class LazyThree {

    /**
     * 默认使用LazyThree的时候会先初始化静态内部类
     * 如果没有使用的话，内部类是不加载的
     * 这时候存在反射侵入
     */

    private static boolean initialized = false;

    private LazyThree() {
        /**
         * 防止构造方法不会被反射方式多次调用造成非单例
         */
        synchronized (LazyThree.class) {
            if (!initialized) {
                initialized = !initialized;
            } else {
                throw new RuntimeException("单例已被侵犯");
            }
        }
    }

    public static final LazyThree getInstance() {
        return LazyHolder.LAZY_THREE;
    }

    /**
     * 利用加载顺序：
     *  先静态、后动态
     *  先属性、后方法
     *  先上后下
     * 的原则
     *
     */
    private static class LazyHolder {
        private static final LazyThree LAZY_THREE = new LazyThree();
    }
}
